home *** CD-ROM | disk | FTP | other *** search
-
- ---------------------------------------------------
- ------- Immortal Descandants CrackMe 5.0 ----------
- ------- by TORN@DO, tutorial by Lucifer48 ---------
- ---------------------------------------------------
-
-
- Je m'excuse par avance; mais ce tutorial est assez embrouillΘ. Bonne lecture tout de mΩme!
-
- ================================================
- 1. INTRODUCTION - PARTIE 1/2 - LE NOM DU FICHIER
- ================================================
-
- C'est la premiΦre chose α savoir. Je propose deux solutions:
- la premiΦre (la plus simple est d'utiliser filemon):
- on obtient le rΘsultat suivant:
-
- 197 20:13:44 Idcrkme5 Open C:\REGISTRATION.DAT NOTFOUND OPENEXISTING OPENALWAYS
- 198 20:13:44 Idcrkme5 Open C:\REGISTRATION.DAT NOTFOUND OPENEXISTING OPENALWAYS
-
- Remarque: la vΘrification du fichier est faite deux fois.
-
- Mais une meilleure mΘthode qui va nous permette: d'une part d'obtenir le nom du fichier,
- et d'autre pouvoir analyser quel contenu mettre dans ce fichier.
- Pour τa dans soft-ice je mets un BPX CreateFileA, nous somme ici:
-
- XXXX:00409B1B PUSH EAX ;80000000 (GENERIC_READ)
- XXXX:00409B1C MOV EBP,[KERNEL32!CreateFileA]
- XXXX:00409B22 PUSH ECX ;REGISTRATION.DAT
- XXXX:00409B23 CALL EBP ;CALL [KERNEL32!CreateFileA]
- XXXX:00409B25 CMP EAX,-01 ;EAX=-1 : fichier non trouvΘ
- XXXX:00409B28 MOV EBP,EAX ;handle du fichier
- XXXX:00409B2A JNZ 00409B48
-
- Donc je cree le fichier REGISTRATION.DAT et on peut continuer en 00409B48.
-
- =================================================
- 2. INTRODUCTION - PARTIE 2/2 - PERDU DANS LE CODE
- =================================================
-
- XXXX:00409B48 PUSH EBP ;sauvegarde l'handle du fichier
- XXXX:00409B49 CALL [KERNEL32!GetFileType]
- XXXX:00409B4F TEST EAX,EAX
- XXXX:00409B51 JNZ 00409B76
- XXXX:00409B53 PUSH EBP ;handle du fichier
- XXXX:00409B54 CALL [KERNEL32!CloseHandle] ;fermeture du fichier
- ...ce n'est la bonne voix a empreinter pour rΘussir le crackme. Fuyons KERNEL32!CloseHandle
- comme la peste!
-
- Lα on se rend compte qu'on est dans les mΘandres de la compilation Vc++ et qu'il bidouille
- toutes sortes de trucs qui m'Θchappent. AprΦs quelques "^p ret" (touche F12); tout devient clair:
-
- XXXX:00401ABE PUSH 0040D724 ;quelques datas
- XXXX:00401AC3 PUSH ECX
- XXXX:00401AC4 CALL 004053C0 ;on sort d'ici
- XXXX:00401AC9 ADD ESP,08 ;pop-pop
- XXXX:00401ACC MOV ESI,EAX
- XXXX:00401ACE TEST ESI,ESI ;si REGISTRATION.DAT n'existe pas ESI=0
- XXXX:00401AD0 JZ 00401B76 ;aller en 00401B76 n'est pas la bonne voie
-
- [...]
- plusieurs de code mal compilΘ... entre elles, il y a la lecture du contenu de notre fichier
- [...]
-
- XXXX:00401B6A XOR EAX,EAX ;ici nous somme sur la bonne voie
- XXXX:00401B6C POP EDI
- XXXX:00401B6D POP ESI
- XXXX:00401B6E POP EBX
- XXXX:00401B6F ADD ESP,00000864 ;wow! pop-pop-...-pop-pop
- XXXX:00401B75 RET
- XXXX:00401B76 MOV EAX,00000001
- XXXX:00401B7B POP EDI
- XXXX:00401B7C POP ESI
- XXXX:00401B7D POP EBX
- XXXX:00401B7E ADD ESP,00000864 ;wow! pop-pop-...-pop-pop
- XXXX:00401B84 RET
-
- Nous somme ici (on n'est dans procedure principale):
-
- XXXX:00401B92 CALL 00401A30 ;<--- on sort d'ici
- XXXX:00401B97 ADD ESP,04 :pop-pop
- XXXX:00401B9A PUSH 00
- XXXX:00401B9C CALL 00401340
- XXXX:00401BA1 ADD ESP,04 ;pop-pop
- XXXX:00401BA4 PUSH 00
- ...
- XXXX:00401BFE CALL 00401DC0
- XXXX:00401C03 ADD ESP,04 ;pop-pop
- XXXX:00401C06 TEST EAX,EAX
- XXXX:00401C08 JZ 00401D18 ;on ne doit pas jumper
- XXXX:00401C0E PUSH 00
- XXXX:00401C10 CALL 00401A30
- XXXX:00401C15 ADD ESP,04 ;pop-pop
- XXXX:00401C18 TEST EAX,EAX
- XXXX:00401C1A JZ 00401D18 ;non pas par lα :)
- XXXX:00401C20 PUSH 00
- XXXX:00401C22 CALL 00401E90
- ...
- et ainsi de suite, il y a 17 call α explorer pour arriver α la fin, le schema est
- toujours le mΩme:
- push 00
- call x
- add esp,04
- test eax,eax
- j(n)z mauvais_keyfile
- ...
- XXXX:00401CFE CALL 00403190
- XXXX:00401D03 ADD ESP,04
- XXXX:00401D06 TEST EAX,EAX
- XXXX:00401D08 JZ 00401D18 ;perdu!
- XXXX:00401D0A MOV EAX,[ESP+04]
- XXXX:00401D0E PUSH EAX
- XXXX:00401D0F CALL 004012E0 ;on a un bon keyfile hourra!
- XXXX:00401D14 ADD ESP,04 ;pop-pop
- XXXX:00401D17 RET
- XXXX:00401D18 MOV EAX,[ESP+04]
- XXXX:00401D1C PUSH EAX
- XXXX:00401D1D CALL 00401290 ;notre keyfile n'est pas bon.
- XXXX:00401D22 ADD ESP,04 ;pop-pop
- XXXX:00401D25 RET
-
- On sait maintenant ce qui nous reste α faire: explorer 17 call (thanks Torn@do) pour gΘnΘrer
- un bon keyfile. C'est maintenant le crackme commence.
-
-
- ==================================================
- 3. PARTIE 01/17 - CALL 00401DC0 (en XXXX:00401BFE)
- ==================================================
-
- Etant donnΘ que chaque call est "structurΘ" de la mΩme faτon, je ne m'interresserais pas au
- dΘbut du call (il teste toujours les mΩme trucs... le fichier existe-t-il?? heureusement sinon on
- serai pas lα!). L'intΘressant (ce que nous a concoctΘ torn@do) de chaque call se situe α la fin
- de la procΘdure, ainsi:
-
- XXXX:00401E56 PUSH EAX ;le contenu de notre keyfile
- XXXX:00401E57 CALL 00405240 ;calcule de la taille du keyfile
- XXXX:00401E5C ADD ESP,10
- XXXX:00401E5F MOV EBX,EAX ;EBX contient la taille de notre keyfile
- ...
- XXXX:00401E6A SUB EBX,00000400 ;400h = 1024d
- XXXX:00401E70 POP EDI
- XXXX:00401E71 POP ESI
- XXXX:00401E72 CMP EBX,01
- XXXX:00401E75 SBB EAX,EAX ;soustrait 1 si la retenue est α 1 (CF=1)
- XXXX:00401E77 POP EBX
- XXXX:00401E78 NEG EAX ;NEG FFFFFFFF = 00000001
- XXXX:00401E7A ADD ESP,00000800
- XXXX:00401E80 RET ;fin du call 00401DC0
-
- Pour passer ce call on doit avoir un keyfile de taille 1024 octets.
-
- Remarque: si on regarde plus en profondeur le call qui calcul la taille du keyfile on se rend
- compte qu'il y a deux petites exceptions:
- contenu (exemple d'un keyfile avec 4 octets):
- REGISTRATION.DAT 31 32 33 34 le call 00405240 renvoit EAX=00000004
- REGISTRATION.DAT 31 1A 33 34 le call 00405240 renvoit EAX=00000001
- REGISTRATION.DAT 31 0D 0A 34 le call 00405240 renvoit EAX=00000003
- (chaque 0D est enlevΘ)
-
- Je m'enpresse donc je crΘer un fichier de 1024 octets.
-
-
- ===============
- 4. LA SURPRISE!
- ===============
-
- VERSION 1:
- ----------
- Je relance le crackme, est lα surprise!!! **boom** je reτois une erreur (page fault).
- AprΦs plusieurs essais, j'en conclus que si le keyfile est supΘrieur α 188 octets alors on
- recoit une page fault sinon τa passe.
- J'avoue que au dΘbut j'ai VRAIMENT cru qu'il y avait un bug! J'ai donc mail-Θ torn@do pour lui
- demander, il m'a rΘpondu qu'il n'y avait pas de bug.
-
- Je pensais sincΦrement qu'il y avait un bug, jusqu'α l'instant ou j'ai pris la dΘcision d'aller
- chercher ou se situe l'erreur.
-
- XXXX:00401B92 CALL 00401A30
- XXXX:00401B97 ADD ESP,04 :pop-pop
- XXXX:00401B9A PUSH 00
- XXXX:00401B9C CALL 00401340 ;PAGE FAULT ICI!
- XXXX:00401BA1 ADD ESP,04 ;pop-pop
-
- En fait, la pile est remplie avec le contenu de notre keyfile (τa, je ne l'ai pas vu tout de suite)
- et donc pour que tout marche, α un certain endroit de notre keyfile, doit se situer la bonne
- adresse de retour du call 00401340 (c'est α dire: 00401BA1).
-
- Tout α la fin du call 00401340 (aprΦs l'instruction add esp,20) si on fait d ESP, on s'apercoit
- qu'on est en plein dans le keyfile (pour moi c'est XOR 67).
- Deplus: 00401340 XOR 67676767 = 67277427
-
- 000000B0 ?? ?? ?? ?? ?? ?? ?? ??-?? 67 27 74 27 ?? ?? ?? .........g't'...
-
- Plus de page fault, on peut continuer.
-
- VERSION 2: La version 1 n'est pas la bonne mΘthode car, le crackme s'attendait α un octet 00
- ---------- On a pas a mettre l'adresse de retour du call dans le keyfile.
- lire la partie suivante pour mieux comprendre.
-
-
- ==================================================
- 5. PARTIE 02/17 - CALL 00401A30 (en XXXX:00401C10)
- ==================================================
-
- Au dΘbut j'ai d'abord pensΘ qu'il n'y avait rien α faire dans ce call, et ensuite j'ai dΘcouvert
- que c'Θtait l'endroit ou il fabriquait, le nom dans la messagebox "request"
-
- ...
- XXXX:00401B3A NOT ECX
- XXXX:00401B3C DEC ECX ;taille de notre "zone de nom"
- XXXX:00401B3D XOR BL,CL ;BL un caractΦre du keyfile
- XXXX:00401B3F MOV ECX,FFFFFFFF
- XXXX:00401B44 SUB EAX,EAX
- XXXX:00401B46 MOV [EDX+0040D186],BL ;sauvegarde du caractΦre xorisΘ
- ...
-
- Exemple avec mon nom, je veux Θcrire "Lucifer48"
-
- 00000090 ?? ?? ?? ?? ?? ?? ?? ??-?? p1 p2 p3 p4 p5 p6 p7 ................
- 000000A0 p8 p9 00 ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- On doit (ABSOLUMENT) mettre un octet zΘro α la fin, et chaque caractΦre est obtenue via un XOR
- de la taille du nom (ici 9). Ansi Lucifer48 devient: 45 7C 6A 60 6F 6C 7B 3D 31
-
- L'octet 00 est trΦs trΦs important, au dΘbut je l'avais pas mis, mais plus tard, comme le
- crackme se sert de τa comme repΦre (REPNZ SCASB), j'ai rencontrΘ quelques problΦmes. Dans mon
- cas, au dΘbut, il croyait que mon nom faisait 67h, et j'ai eu beaucoup de problΦmes par la
- suite (τa dΘbordait dans la pile....).
-
- L'icone du crackme (en haut α gauche!) est toujours un cadena ...
-
-
- ==================================================
- 6. PARTIE 03/17 - CALL 00401E90 (en XXXX:00401C22)
- ==================================================
-
- XXXX:00401F47 MOV DL,[EAX+0040D0F0] ;EAX est initialement nul
- XXXX:00401F4D CMP [EAX+ESP+38],DL ;comparaison avec notre valeur dans le keyfile
- XXXX:00401F51 JNZ 00401F73 ;si non Θgal on quitte (dommage)
- XXXX:00401F53 MOV DWORD PTR [0040D0B4],00000001 ;youpi une nouvelle icone!
- XXXX:00401F5D INC CX
- XXXX:00401F5F CMP CX,09
- XXXX:00401F63 JLE 00401F44
- XXXX:00401F65 MOV EAX,00000001 ;si on passe par lα, c'est bon
- ...
- XXXX:00401F72 RET
-
- On va donc recopier dans notre keyfile les 10 octets qu'il demande. Donc:
-
- 00000000 06 0A 15 07 13 10 0A 72-0C 00 ?? ?? ?? ?? ?? ?? .......r........
-
- On a passΘ ce call, le cadena c'est transformΘ en tΩte de mort :) τa prouve qu'on avance.
-
-
- ==================================================
- 7. PARTIE 04/17 - CALL 00401F80 (en XXXX:00401C34)
- ==================================================
-
- Pour pouvoir continuer, on doit sortir de ce call avec EAX=0.
-
- XXXX:0040210C MOV DWORD PTR [0040D0B4],00000002 ;encore une nouvelle icone!
- XXXX:00402116 XOR EAX,EAX
- XXXX:00402118 POP EBP
- XXXX:00402119 POP EDI
- XXXX:0040211A POP ESI
- XXXX:0040211B POP EBX
- XXXX:0040211C ADD ESP,00000800
- XXXX:00402122 RET ;fin du call 00401F80
-
- Auparavant, il y a quelques xorifications avec une partie de notre keyfile, c'est trΦs facile α
- comprendre. Pour arriver α eax=0, on doit passer quelques comparaisons
- (CMP BL,53 / CMP EAX,6F / CMP ECX,66 / CMP EDX,70 / CMP ESI,49 / CMP EDI,43 / CMP EBP,45)
- Dans le keyfile, on aura:
-
- 00000000 ** ** ** ** ** ** ** **-** ** 07 20 34 3E 09 07 ........... 4>..
- 00000010 0A ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- Remarque: pour ceux qui n'auraient pas compris, "**" signifie que cet octet a dΘjα ΘtΘ trouvΘ
- dans un call prΘcΘdent (voir plus haut), et que "??" est un octet encore non dΘterminΘ.
-
- La nouvelle icone est une croix!
-
-
- ==================================================
- 8. PARTIE 05/17 - CALL 00402130 (en XXXX:00401C46)
- ==================================================
-
- Pour passer ce call on doit sortir avec EAX=1
-
- XXXX:00402241 MOV DWORD PTR [0040D0B4],00000003 ;une nouvelle icone
- XXXX:0040224B MOV EAX,00000001
- XXXX:00402250 POP EBP
- XXXX:00402251 POP EDI
- XXXX:00402252 POP ESI
- XXXX:00402253 POP EBX
- XXXX:00402254 ADD ESP,00000800
- XXXX:0040225A RET ;fin du call 00402130
-
- Il y a quatres comparaisons:
-
- XXXX:004021DA MOVSX ESI,BYTE PTR [ESP+55] ;(cmp ESI,08)
- XXXX:004021DF MOVSX EDI,BYTE PTR [ESP+56] ;(test EDI,EDI)
- XXXX:004021E4 MOVSX EBX,BYTE PTR [ESP+57] ;(test EBX,EBX)
- XXXX:004021E9 MOVSX EBP,BYTE PTR [ESP+58] ;(cmp EBP,05)
-
- Finalement:
- 00000010 ** 08 00 00 05 ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- La nouvelle icone est une tΩte jaune qui fait la gueule.
-
-
- ==================================================
- 9. PARTIE 06/17 - CALL 00402260 (en XXXX:00401C58)
- ==================================================
-
- Voilα la bonne sortie:
-
- XXXX:00402597 MOV DWORD PTR [0040D0B4],00000004 ;nouvelle icone
- XXXX:004025A1 XOR EAX,EAX
- XXXX:004025A3 POP EBP
- XXXX:004025A4 POP EDI
- XXXX:004025A5 POP ESI
- XXXX:004025A6 POP EBX
- XXXX:004025A7 ADD ESP,00000834
- XXXX:004025AD RET ;fin du call 00402260
-
- On a 17 nouveaux octets α trouver, voilα un petit rΘcapitulatif:
- Soient b0, b1, ...,bG les 17 octets. Ainsi:
-
- b0 OR 56 ebx =5E | b9 OR 53 [esp+24] =7F
- b1 OR 49 [esp+10] =4D | bA OR 20 [esp+28] =63
- b2 OR 53 [esp+14] =53 | bB OR 53 [esp+2C] =5B
- b3 OR 49 ebp =5B | bC OR 49 [esp+30] =4B
- b4 OR 54 esi =5E | bD OR 54 [esp+34] =7E
- b5 OR 20 edi =32 | bE OR 45 [esp+38] =4F
- b6 OR 54 [esp+18] =57 | bF OR 21 [esp+40] =65
- b7 OR 48 [esp+1C] =5A | bG OR 21 [esp+44] =75
- b8 OR 49 [esp+20] =4B |
-
- La il peut y avoir de nombreuses possibilitΘs. Je vais n'en choisir qu'une seule:
- (rΘsultat XOR masque)
-
- RΘsultat dans le keyfile:
-
- 00000010 ** ** ** ** ** 08 04 00-12 0A 12 03 12 02 2C 43 ..............,C
- 00000020 08 02 2A 0A 44 54 ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ..*.DT..........
-
-
- ===================================================
- 10. PARTIE 07/17 - CALL 004025B0 (en XXXX:00401C6A)
- ===================================================
-
- Le call utilise les quatres octets suivant:
-
- 00000050 X1 X2 X3 X4 ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- A un moment y'a une comparaison:
-
- XXXX:004026EB CMP DWORD PTR [0040EA98],04 ;DWORD PTR [0040EA98] = 000000X2
- XXXX:004026F2 MOV [0040EA9C],EAX
- XXXX:004026F7 JAE 0040271A
-
- Y'a ensuite appel α GetLocalTime (il se sert de l'annΘe). Il fabrique un sorte de checksum avec
- ces 4 octets, est compare avec 1999, j'ai pas tout compris ;) Ensuite:
-
-
- XXXX:00402751 MOV DWORD PTR [0040D0B4],00000005 ;nouvelle icone
- XXXX:0040275B XOR EAX,EAX
- ...
- XXXX:00402775 MOV EAX,00000001
- XXXX:0040277A POP EDI
- XXXX:0040277B POP ESI
- XXXX:0040277C ADD ESP,00000814
- XXXX:00402782 RET ;fin du call 004025B0
-
- J'ai mis X1=X2=X3=X4=FF et τa marche, j'ai pas trop cherchΘ α comprendre pourquoi et j'ai
- continuΘ.
-
- La nouvelle icone est une tΩte jaune ronde (avec la bouche en forme de "o").
-
-
- ===================================================
- 11. PARTIE 08/17 - CALL 00402790 (en XXXX:00401C7C)
- ===================================================
-
- On doit sortir avec EAX=1. C'est trΦs simple:
-
- XXXX:0040283E MOVSX EAX,BYTE PTR [ESP+00000091] ;un caractΦre de notre keyfile
- XXXX:00402846 MOVSX ECX,BYTE PTR [ESP+00000090] ;un autre caractΦre du keyfile
- XXXX:0040284E ADD ESP,04
- XXXX:00402851 MOV [0040EA88],EAX
- XXXX:00402856 CMP ECX,17
- XXXX:00402859 JA 00402884 ;mauvais saut
- XXXX:0040285B CMP EAX,3B
- XXXX:0040285E JA 00402884 ;mauvais saut
- XXXX:00402860 MOV DWORD PTR [0040D0B4],00000005 ;une nouvelle icone
- ...
- XXXX:0040287E MOV EAX,00000001
- XXXX:00402883 RET ;fin du call 00402790
-
- Dans le keyfile:
- 00000050 ** ** ** ** 17 3B ?? ??-?? ?? ?? ?? ?? ?? ?? ?? .....;..........
-
-
- ===================================================
- 12. PARTIE 09/17 - CALL 004028A0 (en XXXX:00401C8E)
- ===================================================
-
- XXXX:00402952 MOVSX EAX,SI ;SI=0001
- XXXX:00402958 MOV CL,[EAX+0040D0FF] ;datas du crackme
- XXXX:0040295E CMP [EAX+ESP+00000107],CL ;comparaison avec le contenu de notre keyfile
- XXXX:00402965 JNZ 00402987 ;il faut que τa soit Θgal
- XXXX:00402967 INC SI
- XXXX:00402969 CMP SI,58 ;58h = 88d
- XXXX:0040296D JLE 0040294B ;boucle
- XXXX:0040296F MOV DWORD PTR [0040D0B4],00000007 ;nouvelle icone
- XXXX:00402979 MOV EAX,00000001
- XXXX:0040297E POP EDI
- XXXX:0040297F POP ESI
- XXXX:00402980 ADD ESP,00000800
- XXXX:00402986 RET ;fin du call 004028A0
-
- On rajoute dans le keyfile:
-
- 000000D0 53 55 50 50 4F 52 54 20-54 48 45 20 53 4F 46 54 SUPPORT THE SOFT
- 000000E0 57 41 52 45 20 41 55 54-48 4F 52 53 20 42 59 20 WARE AUTHORS BY
- 000000F0 42 55 59 49 4E 47 20 54-48 45 20 50 52 4F 47 52 BUYING THE PROGR
- 00000100 41 4D 53 20 49 46 20 59-4F 55 20 55 53 45 20 54 AMS IF YOU USE T
- 00000110 48 45 4D 20 41 46 54 45-52 20 43 52 41 43 4B 49 HEM AFTER CRACKI
- 00000120 4E 47 20 54 48 45 4D 21-?? ?? ?? ?? ?? ?? ?? ?? NG THEM!........
-
- L'icone a changΘe, c'est maintenant (toujours une tΩte jaune) mais elle ouvre la boucle...
-
-
- ===================================================
- 13. PARTIE 10/17 - CALL 004029A0 (en XXXX:00401C9C)
- ===================================================
-
- XXXX:00402A68 MOVSX EAX,SI
- XXXX:00402A6B ADD ESP,04
- XXXX:00402A6E MOV CL,[EAX+0040D1C7] ;datas
- XXXX:00402A74 CMP [EAX+ESP+00000187],CL ;comparaisons avec notre keyfile
- XXXX:00402A7B JNZ 00402AAC ;ne surtout pas empreinter ce jump
- XXXX:00402A7D INC SI
- XXXX:00402A7F MOV EDI,0040D1C8 ;datas, immΘdiatement suivis par un bout du
- XXXX:00402A84 MOV ECX,FFFFFFFF ; contenu du keyfile
- XXXX:00402A89 SUB EAX,EAX
- XXXX:00402A8B REPNZ SCASB ;dΘtermine la longueur de la chaεne
- XXXX:00402A8D MOVSX EAX,SI
- XXXX:00402A90 NOT ECX
- XXXX:00402A92 DEC ECX
- XXXX:00402A93 CMP ECX,EAX ;fin de la boucle ?
- XXXX:00402A95 JAE 00402A61
- XXXX:00402A97 MOV DWORD PTR [0040D0B4],00000008 ;nouvelle icone
- XXXX:00402AA1 XOR EAX,EAX
- XXXX:00402AA3 POP EDI
- XXXX:00402AA4 POP ESI
- XXXX:00402AA5 ADD ESP,00000800
- XXXX:00402AAB RET ;fin du call 004029A0
-
- Je rejoute donc quelques datas dans mon keyfile.
-
- 00000150 36 37 3C 3E 3E 32 54 4A-52 32 35 35 3C 35 3C 3A 67<>>2TJR255<5<;
- 00000160 37 32 3E 37 35 3C 38 ??-?? ?? ?? ?? ?? ?? ?? ?? 72>75<8.........
-
- Ces datas proviennent directement de:
- [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
- "ProductId"="12799-OEM-0070752-92073"
-
-
- ===================================================
- 14. PARTIE 11/17 - CALL 00402AC0 (en XXXX:00401CAA)
- ===================================================
-
- Objectif: sortir du call avec EAX=1
-
- XXXX:00402B70 MOVSX EAX,CX ;CX vaut initialement 1
- XXXX:00402B73 INC CX
- XXXX:00402B75 MOVSX EDX,BYTE PTR [EAX+ESP+3B] ;pointe vers le debut de notre keyfile
- XXXX:00402B7A ADD EBX,EDX
- XXXX:00402B7C CMP CX,64 ;64d = 100d
- XXXX:00402B80 JLE 00402B70 ;boucle
- XXXX:00402B82 XOR EBX,000007CF
-
- La division euclidienne de EBX par 10 doit Ωtre Θgal α la valeur d'un certain octet de notre
- keyfile, On en dΘduit que EBX div 10 = 255 (soit FF, au maximum, sinon τa dΘpasse d'un octet,
- autrement dit, EBX ne doit pas dΘpasser 0x9FF). Voir remarque ci dessous.
-
- J'ai donc rempli α ma convenance les parties non utilisΘes du keyfile.
-
- XXXX:00402BA2 MOV EAX,EBX ;somme des 100 premiers caractΦres
- XXXX:00402BA4 SUB EDX,EDX
- XXXX:00402BA6 DIV ECX ;ECX=0000000A
- XXXX:00402BA8 MOVSX ECX,BYTE PTR [ESP+000003EC]
- XXXX:00402BB0 MOV [0040D1A8]
- XXXX:00402BB5 CMP EAX,ECX ;cmp ZZ,EAX
- XXXX:00402BB7 JZ 00402BC5 ;il faut que τa soit Θgal!
- ...
- XXXX:00402BC5 MOV DWORD PTR [0040D0B4],00000009 ;nouvelle icone
- XXXX:00402BCF MOV EAX,00000001
- XXXX:00402BD4 POP EDI
- XXXX:00402BD5 POP ESI
- XXXX:00402BD6 POP EBX
- XXXX:00402BD7 ADD ESP,00000800
- XXXX:00402BDD RET ;fin du call 00402AC0
-
- 000003B0 ZZ ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- ZZ= est le rΘsultat (un octet) de la division euclidienne (pour moi c'est ZZ=3B)
-
- Remaque: ZZ=00 n'est pas un cas trΦs interessant, je vais l'ignorer.
- Choissisez un octet entre 10 et 7Fh=127d, car si par exemple vous avez ZZ=0xF0 alors l'instruction
- MOVSX ECX,F0 aura pour rΘsultat ECX=FFFFFFF0.
- (attention MOVSX <> MOVZX) et si ZZ<0xA on ne pourra pas continuer.
- Un conseil pour le choix de ZZ: pas un trop gros nombre.
-
-
- ===================================================
- 15. PARTIE 12/17 - CALL 00402BE0 (en XXXX:00401CB8)
- ===================================================
-
- On doit avoir EAX=1 en sortant du call. Cette procedure ressemble beaucoup α la prΘcΘdente, on
- peut la considΘrer comme un addon.
-
- XXXX:00402CD2 DIV ECX ;ECX=54, effectue ZZ▓ DIV ECX
- XXXX:00402CD4 MOVSX EDX,BYTE PTR [ESP+000003ED] ;lit un caractΦre de notre keyfile
- XXXX:00402CDC MOV [0040D1AC],EAX ;YY
- XXXX:00402CE1 CMP EDX,EAX ;on doit avoir EAX=EDX
- XXXX:00402CE3 JZ 00402CF1
- ...
- XXXX:00402CF1 MOV DWORD PTR [0040D0B4],0000000A ;nouvelle icone, la 10Φme!
- XXXX:00402CFB MOV EAX,00000001
- XXXX:00402D00 POP EDI
- XXXX:00402D01 POP ESI
- XXXX:00402D02 POP EBX
- XXXX:00402D03 ADD ESP,00000800
- XXXX:00402D09 RET ;fin du call 00402BE0
-
- 000003B0 ZZ YY ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- YY = ZZ▓ div 54 (YY et ZZ sont deux octets, et ZZ>9 (9h*9h=51h) )
-
- Remaque: YY=00 n'est pas un cas trΦs interessant, je vais l'ignorer.
- on doit avoir (ZZ▓ div 54) > YY
-
-
- ===================================================
- 16. PARTIE 13/17 - CALL 00402D10 (en XXXX:00401CC6)
- ===================================================
-
- XXXX:00402DFD MOVSX ECX,BYTE PTR [EAX+ESP+3B] ;le dΘbut du keyfile
- XXXX:00402E02 ADD ESI,ECX ;esi est initialement nul
- XXXX:00402E04 INC EAX ;eax est initialement nul
- XXXX:00402E05 CMP EAX,00000180 ;180h = 384d
- XXXX:00402E0A JBE 00402DFD ;boucle
- XXXX:00402E0C MOV EDI,EAX
- ...
- XXXX:00402E1A IMUL EAX,EDI ;YY*ZZ
- XXXX:00402E1D XOR EAX,ESI ;esi somme des 384 caractΦres = SUM
- XXXX:00402E1F MOV ECX,00000216
- XXXX:00402E24 SUB EDX,EDX ;xor edx,edx
- XXXX:00402E26 DIV ECX
- XXXX:00402E28 MOVSX EDX,BYTE PTR [ESP+000003EE]
- XXXX:00402E30 MOV [0040D1B0],EAX ;TT
- XXXX:00402E35 CMP EDX,EAX ;cmp TT,EAX
- XXXX:00402E37 JZ 00402E45
-
- 000003B0 ZZ YY TT ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
-
- XXXX:00402E45 MOV DWORD PTR [0040D0B4],0000000B ;encore une nouvelle icone
- XXXX:00402E4F MOV EAX,00000001
- XXXX:00402E54 POP EDI
- XXXX:00402E55 POP ESI
- XXXX:00402E56 POP EBX
- XXXX:00402E57 ADD ESP,00000800
- XXXX:00402E5D RET ;fin du call 00402D10
-
- Remarque: en supposant que l'on veut TT non nul.
- ( (YY*ZZ) XOR SUM ) div 216 = TT avec forcΘment TT > YY
-
- L'icone me sourit, c'est bon signe!
-
-
- ===================================================
- 17. PARTIE 14/17 - CALL 00402E60 (en XXXX:00401CD4)
- ===================================================
-
- Ce call dΘpend directement des 3 calls qui prΘcΦdent, attention on en trouve pas une bonne
- combinaison au hasard!
-
- XXXX:00402F07 MOV EAX,[0040D1B0] ;TT
- XXXX:00402F0C MOV ECX,[0040D1AC] ;YY (dΘpend des 64h premiers octets du keyfile)
- XXXX:00402F12 MOV ESI,[0040D1A8] ;ZZ (dΘpend des 64h premiers octets du keyfile)
- ...
- [...]
- ...
- XXXX:00402F38 MOVSX EDX,BYTE PTR [ESP+000003EB]
- XXXX:00402F40 MOV [040D1B4],EAX ;UU
- XXXX:00402F45 CMP EDX,EAX
- XXXX:00402F47 JZ 00402F54
-
- Qu'est-ce que fait [...] ?
- Il faut que (TT div YY)*(ZZ div YY)*(TT+YY+ZZ) <> 0 ===> TT > YY et ZZ > YY
-
- XXXX:00402F54 MOV DWORD PTR [0040D0B4],0000000C
- XXXX:00402F5E MOV EAX,00000001
- XXXX:00402F63 POP EDI
- XXXX:00402F64 POP ESI
- XXXX:00402F65 ADD ESP,00000800
- XXXX:00402F6B RET ;fin du call 00402E60
-
-
- ===================================================
- 18. PARTIE 15/17 - CALL 00402F70 (en XXXX:00401CE2)
- ===================================================
-
- Il se ressert de la boucle "180h" (voir plus haut, chapitre 16.)
-
- XXXX:0040303B DIV ECX ;ECX=1F4
- XXXX:0040303D MOVSX EDX,BYTE PTR [ESP+000003F0] ;l'octet un octet provenant de notre keyfile
- XXXX:00403045 MOV [0040D1B8],EAX ;VV
- XXXX:0040304C JZ 0040305D ;on doit empreinter ce saut
- ...
- XXXX:0040305D MOV DWORD PTR [0040D0B4],000000D
- XXXX:00403067 XOR EAX,EAX
- XXXX:00403069 POP EDI
- XXXX:0040306A POP ESI
- XXXX:0040306B POP EBX
- XXXX:0040306C ADD ESP,00000800
- XXXX:00403072 RET ;fin du call 00402F70
-
-
- ===================================================
- 19. PARTIE 16/17 - CALL 00403080 (en XXXX:00401CF0)
- ===================================================
-
- Courage, c'est trΦs trΦs bient⌠t la fin!!!!!
-
- XXXX:00403127 MOV ECX,[0040D1B8] ;VV
- XXXX:0040312D ADD ECX,[0040D1B4] ;UU
- XXXX:00403133 ADD ECX,[0040D1B0] ;TT
- XXXX:00403139 ADD ECX,[0040D1AC] ;YY
- XXXX:0040313F ADD ECX,[0040D1A8] ;ZZ
- XXXX:00403145 MOV [ESP+18],ECX ;pour moi j'obtiens: DA
- XXXX:00403149 MOV DWORD PTR [ESP+1C],00000000
- XXXX:00403151 MOV QWORD PTR [ESP+18] ;calcul flottant sur 64 bits
- XXXX:00403155 FSQRT ;racine carrΘ (instruction du co-processeur)
- XXXX:00403157 CALL 0040420C ;rΘsultat de l'opΘration en EAX
- XXXX:0040315C MOVSX ECX,BYTE PTR [ESP+000003ED]
- XXXX:00403164 CMP EAX,ECX
- XXXX:00403166 JZ 00403173
- ...
- XXXX:00403173 MOV DWORD PTR [0040D0B4],0000000E
- XXXX:0040317D MOV EAX,00000001
- XXXX:00403182 POP EDI
- XXXX:00403183 POP ESI
- XXXX:00403184 ADD ESP,00000800
- XXXX:0040318A RET ;fin du call 00403080
-
- Un exemple: 0xDA = 218 et racine carrΘ(218)=14.7648.. on arrandit α 14 (valeur plancher)
- soit 0xE, et c'est le rΘsultat α trouver.
-
- DerniΦre icone!!!
-
-
- ===================================================
- 20. PARTIE 17/17 - CALL 00403080 (en XXXX:00401CF0)
- ===================================================
-
- Dernier call, c'est trΦs facile, il vΘrifie si le dernier caractΦre du keyfile est bien un "R"
-
- XXXX:00403237 CMP BYTE PTR [ESP+00000437],52 ;52 ("R")
- XXXX:0040323F JZ 0040324C
- ...
- XXXX:0040324C MOV DWORD PTR [0040D0B4],0000000F
- XXXX:00403256 MOV EAX,00000001
- XXXX:0040325B POP EDI
- XXXX:0040325C POP ESI
- XXXX:0040325D ADD ESP,00000800
- XXXX:00403263 RET ;fin du call 00403080
-
- On a fini!!!!!!!!!!
-
-
- ==============
- 21. CONCLUSION
- ==============
-
- J'ai mis du temp α trouver que le nom Θtait Θcrit α l'offset 9A (soit le 9B Φme octet du keyfile)
- et qu'il devait se terminer par 00 (un octet nul), sinon la pile dΘborde, et on a des problΦmes!!!!
- Dans ces call:
- 4. LA SURPRISE!
- 12. PARTIE 09/17 - CALL 004028A0 (en XXXX:00401C8E)
- 13. PARTIE 10/17 - CALL 004029A0 (en XXXX:00401C9C)
-
- MoralitΘ, ce crackme est quand mΩme relativement dur, mais on peut quand mΩme y arriver!
-
- Lucifer48, le 27 mai 1999
-
- PS: C'est vrai que en y repenssant, τa me paraissait bizarre de gΘrer volontairement le
- dΘbordement de la pile, avec un langage de haut niveau tel que le C++. J'avoue que
- l'instruction REPNZ SCASB aurait du me mettre sur la bonne piste plus t⌠t, τa m'apprendra α
- remplir mon keyfile avec des octets 33!!!
-